package actions.owners;

import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.TemporalType;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.io.FileUtils;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;
import org.jboss.seam.faces.FacesMessages;
import org.richfaces.event.UploadEvent;
import org.richfaces.model.UploadItem;

import utils.Propiedades;
import domain.Foto;
import domain.Mesa;
import domain.Municipio;
import domain.Provincia;
import domain.Reserva;
import domain.Reservamesa;
import domain.Restaurante;

@Name("reservas")
@SuppressWarnings("all")
@Scope(ScopeType.SESSION)
public class GestionReservasAction implements Serializable {

	final String cena="CENA";
	final String almuerzo="ALMUERZO";
	final String ambos="AMBOS";
	final long dosDias=24*60*60*1000; 
	
	
	@In
	FacesMessages facesMessages;

	@In
	EntityManager em;

	@In(required = false)
	@Out
	private Restaurante myRestaurant;
	
	private Date fechaInicioReservas = new Date();
	private Date fechaFinReservas = new Date(fechaInicioReservas.getTime());
	private String horarioReserva;
	
	@DataModel
	List<Reserva> misReservas;
	
	@DataModelSelection("misReservas")
	Reserva reservaSeleccionada;
	
	@DataModel
	List<Reservamesa> mesasReserva = new ArrayList<Reservamesa>();
	
	
	
	@Factory("misReservas")
	public void findBookings(){
		String sql = "FROM Reserva r join fetch r.reservamesas WHERE r.restaurante = " + myRestaurant.getRestaurante() + 
		" AND r.fecha >=? AND r.fecha<=? ";
		
		if(horarioReserva.equals(cena))
			sql += " AND r.almuerzo = 0 ";
		
		if(horarioReserva.equals(almuerzo))
			sql += " AND r.almuerzo = 1 ";
		
		
		Query q = em.createQuery(sql);
		q.setParameter(1, fechaInicioReservas,TemporalType.DATE);
		q.setParameter(1, fechaInicioReservas,TemporalType.DATE);
		
		misReservas = q.getResultList();
		
		if( misReservas == null || misReservas.isEmpty() )
			facesMessages.add("La búsqueda no ha producido ningún resultado");
		
		
	}
	
	public void verDetallesReserva(){
		mesasReserva = em.createQuery("FROM ReservaMesa rm WHERE rm.reserva.reserva = " + reservaSeleccionada.getReserva()).getResultList();

	}
	
	public void cancelarReserva(){
		if((System.currentTimeMillis() - reservaSeleccionada.getFecha().getTime())<dosDias){
			facesMessages.add("No se puede cancelar la reserva porque solo se pueden cancelar con un periodo mínimo de dos dias de antelación.");
		}else{
			reservaSeleccionada = em.find(Reserva.class, reservaSeleccionada.getReserva());
			em.remove(reservaSeleccionada);
			this.actualizarReservas();
		}
	}
	
	
	
	public void actualizarReservas(){
		//Marcando el @Datamodel a null se ejecuta el @Factory automáticamente (Se actualiza el listado)
		misReservas = null;
	}
	
	
	
	
	/*******************************************
	 * Getters & Setters
	 ********************************************/



	public Date getFechaInicioReservas() {
		return fechaInicioReservas;
	}

	public void setFechaInicioReservas(Date fechaInicioReservas) {
		this.fechaInicioReservas = fechaInicioReservas;
	}

	public Date getFechaFinReservas() {
		return fechaFinReservas;
	}

	public void setFechaFinReservas(Date fechaFinReservas) {
		this.fechaFinReservas = fechaFinReservas;
	}

	public String getHorarioReserva() {
		return horarioReserva;
	}

	public void setHorarioReserva(String horarioReserva) {
		this.horarioReserva = horarioReserva;
	}

}
